package cn.shop.utils;

import cn.shop.base.MyPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @author : 李一涵
 * @date : Created in 2021-11-1 16:51
 * @description : 通用类
 */
public class PageUtil {

    /**
     * 格式化List内元素的方法，如果方法为空则按原list返回
     *
     * @param list 要格式化的集合
     * @param func 格式化数据的方法
     * @param <T> 源数据类型
     * @param <R> 目标数据类型
     * @return 格式化以后的集合
     */
    public static<T, R> List<?> formatRecords(List<T> list, Function<T, R> func) {
        if (func == null) {
            return list;
        }
        return list.stream().map(func).collect(Collectors.toList());
    }

    /**
     * 格式化mybatis-plus的对象，并将查询的结果集转成其他形式的结果集
     * @param page 分页对象
     * @param func 数据格式化方法
     * @param <T> 原始类型
     * @param <R> 格式化后的类型
     * @return 格式化以后的返回对象
     */
    public static<T, R>Map<String, Object> formatPage(Page<T> page, Function<T, R> func) {
        return Putif.start()
                .anyway("current", page.getCurrent())
                .anyway("next", page.hasNext() ? page.getCurrent() + 1 : -1)
                .anyway("prev", page.hasPrevious() ? page.getCurrent() -1 : -1)
                .anyway("total", page.getTotal())
                .anyway("pages", page.getPages())
                .anyway("records", formatRecords(page.getRecords(), func))
                .get();
    }

    public static<T, R>Map<String, Object> formatPage(MyPage<T> page, Function<T, R> func) {
        return Putif.start()
                .anyway("current", page.getCurrent())
                .anyway("next", page.hasNext() ? page.getCurrent() + 1 : -1)
                .anyway("prev", page.hasPrevious() ? page.getCurrent() -1 : -1)
                .anyway("total", page.getTotal())
                .anyway("pages", page.getPages())
                .anyway("records", formatRecords(page.getRecords(), func))
                .get();
    }
}
